package com.bzkj.msfx.service.impl;


import com.bzkj.common.core.domain.AjaxResult;
import com.bzkj.common.utils.file.FileUploadUtils;
import com.bzkj.common.utils.file.MimeTypeUtils;
import com.bzkj.msfx.domain.MsfxCustomer;
import com.bzkj.msfx.mapper.MsfxCustomerMapper;
import com.bzkj.msfx.service.MsfxCustomerService;
import com.bzkj.msfx.utils.FusionHttpUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @projectName: bzkj-wms
 * @package: com.bzkj.service.impl
 * @className: MsfxCustomerServiceImpl
 * @description: 码上放心客户服务层实现类
 * @author: C1309
 * @createDate: 2024年10月22日
 * @version: v1.0
 */
@Service
@Slf4j
public class MsfxCustomerServiceImpl implements MsfxCustomerService {

    @Resource
    private FusionHttpUtils fusionHttpUtils;

    @Resource
    private MsfxCustomerMapper customerMapper;

    /**
     * 添加码上放心客户（单个添加）
     *
     * @param msfxCustomerFile 码上放心客户文件
     * @return 影响行数
     */
    @Override
    public AjaxResult insertMsfxCustomer(MultipartFile msfxCustomerFile) {
        try {
            return fusionHttpUtils.sendFiles(msfxCustomerFile, "/basic/msfxCustomer/insert");
        } catch (Exception e) {
            // 使用日志框架替代 printStackTrace()
            e.printStackTrace();

//            log.warn("码上放心往来单位文件处理失败，原因：{}", e.getMessage(), e);
            return AjaxResult.error("码上放心往来单位文件处理失败，原因：" + e.getMessage());
        }
    }


    /**
     * 查询码上放心客户集合
     *
     * @param msfxCustomer 查询条件
     * @return 码上放心客户集合
     */
    @Override
    public List<MsfxCustomer> selectMsfxCustomerList(MsfxCustomer msfxCustomer) {
        return customerMapper.selectMsfxCustomerList(msfxCustomer);
    }

    /**
     * 根据数据库主键ID查询码上放心客户信息
     *
     * @param id 数据库主键ID
     * @return 码上放心客户信息
     */
    @Override
    public MsfxCustomer selectMsfxCustomerById(Long id) {
        return null;
    }

    /**
     * 解析码上放心客户文件
     *
     * @param msfxCustomerFile 码上放心客户文件
     * @param filePath         文件路径
     * @param deptId           部门ID
     * @param factory          工厂编号
     * @return 解析结果
     */
    @Override
    public AjaxResult parsingFile(MultipartFile msfxCustomerFile, String filePath, Long deptId, String factory) {

        String realFileUrl;
        try {
            // 先向融合系统中导入往来单位信息
            AjaxResult ajaxResult = fusionHttpUtils.sendFiles(msfxCustomerFile, "/basic/msfxCustomer/insert");
            //如果融合系统返回成功，则向融合系统导入码上放心往来单位信息
            if (ajaxResult.isSuccess()) {
                String fileName = FileUploadUtils.upload(filePath, msfxCustomerFile, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, false);
                realFileUrl = filePath + "/" + fileName;
                // 获取文件名的后缀
                String extension = FileUploadUtils.getExtension(msfxCustomerFile);

                Map<String, Object> resMap = new HashMap<>();
                if ("txt".equalsIgnoreCase(extension)) {
                    resMap = parsingMsfxCustomer(realFileUrl, true);
                }

                if ((boolean) resMap.get("status")) {
                    @SuppressWarnings("unchecked")
                    List<MsfxCustomer> msfxCustomers = (List<MsfxCustomer>) resMap.get("data");
                    Map<String, Object> processResult = processCustomers(msfxCustomers, factory);
                    int sum = (int) processResult.get("sum");

                    if (sum == msfxCustomers.size()) {
                        return AjaxResult.success("码上放心往来单位信息导入成功！本次共新增" + sum + "个码上放心往来单位信息。");
                    }
                    return AjaxResult.warn("码上放心往来单位信息部分导入成功！本次共新增" + sum + "个码上放心往来单位信息。" + resMap.get("msg"));
                } else {
                    return AjaxResult.error("文件解析失败");
                }
            }
            return ajaxResult;
        } catch (IOException e) {
            log.warn("文件上传失败!失败原因为：" + e.getMessage());
            return AjaxResult.error("文件上传失败：" + e.getMessage());
        } catch (Exception e) {
            log.warn("服务器错误!错误原因可能为：" + e.getMessage());
            return AjaxResult.error("服务器错误，原因：" + e.getMessage());
        }
    }

    /**
     * 处理码上放心往来单位信息
     *
     * @param msfxCustomers 码上放心往来单位信息列表
     * @return 返回处理结果，包含成功处理的记录数和错误信息
     */
    private Map<String, Object> processCustomers(List<MsfxCustomer> msfxCustomers, String factory) {
        int sum = 0;
        StringBuilder msg = new StringBuilder();
        for (MsfxCustomer customer : msfxCustomers) {
            try {
                int i = customerMapper.insertMsfxCustomer(customer, factory);
                sum += i;
            } catch (Exception e) {
                if (customer.getCustomerId() != null) {
                    int i = customerMapper.insertMsfxCustomer(customer, factory);
                    sum += i;
                } else {
                    msg.append("往来单位名称为【").append(customer.getCustomerName()).append("】的往来单位信息缺少往来单位编号！");
                }
            }
        }
        Map<String, Object> result = new HashMap<>();
        result.put("sum", sum);
        result.put("msg", msg.length() > 0 ? msg.toString() : null);
        return result;
    }


    /**
     * 解析往来单位信息
     *
     * @param url 药品信息文件路径
     * @param del 是否删除文件
     * @return 文件解析结果
     */
    public static Map<String, Object> parsingMsfxCustomer(String url, Boolean del) {
        ArrayList<MsfxCustomer> msfxCustomers = new ArrayList<>();
        Map<String, Object> resMap = new HashMap<>();
        try {

            File txtFile = new File(url);
            BufferedReader reader = new BufferedReader(new InputStreamReader(Files.newInputStream(txtFile.toPath()), "GBK"));
            String line;
            while ((line = reader.readLine()) != null) {
                if (!line.isEmpty()) {
                    MsfxCustomer msfxCustomer = getMsfxCustomer(line);
                    msfxCustomers.add(msfxCustomer);
                }
            }
            resMap.put("status", true);
            resMap.put("msg", "文件读取成功");
            resMap.put("data", msfxCustomers);
            //判断文件是否删除
            if (del) {
                new File(url).delete();
            }
        } catch (IOException e) {
            // 处理异常，可以根据实际需求进行处理
            resMap.put("status", false);
            resMap.put("msg", "文件读取失败！");
        }
        return resMap;
    }

    @NotNull
    private static MsfxCustomer getMsfxCustomer(String line) {
        MsfxCustomer msfxCustomer = new MsfxCustomer();
        String[] split = line.split(",");
        if (split.length == 3) {
            msfxCustomer.setCustomerId(split[2]);
            msfxCustomer.setCustomerRefEntId(split[1]);
            msfxCustomer.setCustomerName(split[0]);
        } else if (split.length == 2) {
            msfxCustomer.setCustomerRefEntId(split[1]);
            msfxCustomer.setCustomerName(split[0]);
        }
        return msfxCustomer;
    }
}
